//
//  QSWaterflowLayout.m
//  TestTouchEvent
//
//  Created by apple on 2016/11/29.
//  Copyright © 2016年 Song. All rights reserved.
//

#import "QSWaterflowLayout.h"

@interface QSWaterflowLayout()
/**
 *  保存每一列最大的Y值
 */
@property (nonatomic, strong) NSMutableArray *maxYArray;

/**
 *  最大列数
 */
@property (nonatomic, assign) NSInteger maxColumn;
@end

@implementation QSWaterflowLayout
#pragma mark - 懒加载
- (NSMutableArray *)maxYArray {
    if (nil == _maxYArray) {
        _maxYArray = [NSMutableArray array];
    }
    return _maxYArray;
}

/**
 *  准备布局的时候调用, 当布局刷新
 */
- (void)prepareLayout {
    [super prepareLayout];
    
    // 设置最大的列数
    self.maxColumn = [self.delegate numberOfColumnInWaterflowLayout:self];
}

/**
 *  当可见范围发生变化的时候, 就会重新布局
 */
- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds {
    return YES;
}

#pragma mark - 反回的是每一个cell的属性
// 对每一个cell的属性进行设置, frame(x,y,width, height)
- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath {
    // 确定组的内间距
    UIEdgeInsets sectionInsets = UIEdgeInsetsMake(10, 10, 10, 10);
    
    // 取出collectionView 的 size
    CGSize collectionViewSize = self.collectionView.frame.size;
    
    // 确定cell 的宽度
    CGFloat itemWidth = (collectionViewSize.width - sectionInsets.left - sectionInsets.right - (_maxColumn - 1) * self.minimumInteritemSpacing) / _maxColumn;
    
    // 确定cell的高度
    CGFloat itemHeight = [self.delegate waterFlowLayout:self withIndexPath:indexPath andItemWidth:itemWidth];
    
    // 确定cell 的 x 和 y
    // 找到 最短列的最大Y值
    CGFloat minColumnY = [self.maxYArray[0] doubleValue];
    
    // 定义 最短的列
    NSInteger minColumn = 0;
    
    for (int i = 1; i < _maxColumn; i++) {
        // 取出数组中的Y值
        CGFloat arrayY = [self.maxYArray[i] doubleValue];
        
        if (minColumnY > arrayY) {
            // 确定最短的最大Y值
            minColumnY = arrayY;
            minColumn = i;
        }
    }
    
    CGFloat itemX = minColumn * itemWidth + minColumn * self.minimumInteritemSpacing + sectionInsets.left;
    CGFloat itemY = minColumnY + self.minimumLineSpacing;
    
    UICollectionViewLayoutAttributes *attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
    
    attributes.frame = CGRectMake(itemX, itemY, itemWidth, itemHeight);
    
    // 记录 最大Y值
    self.maxYArray[minColumn] = @(CGRectGetMaxY(attributes.frame));
    
    return attributes;
}

#pragma mark -  返回可见区域的cell属性
- (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect {
    // 在每次调用这个方法的时候, 最好把 maxYArray 给清空掉
    [self.maxYArray removeAllObjects];
    
    // 对数组做初始化
    for (int i = 0; i < _maxColumn; i++) {
        [self.maxYArray addObject:@0];
    }
    
    // 实例化一个可变数组
    NSMutableArray *itemArray = [NSMutableArray array];
    
    // 取出当前有多少个cell, 反回第0组有多少个cell
    NSInteger itemCount = [self.collectionView numberOfItemsInSection:0];
    
    for (int i = 0; i < itemCount; i++) {
        // 创建一个 indexPath
        NSIndexPath *indexPath = [NSIndexPath indexPathForItem:i inSection:0];
        
        // 调用 layoutAttributesForItemAtIndexPath: 返回是对应到indexPath 中cell的属性
        UICollectionViewLayoutAttributes *attri = [self layoutAttributesForItemAtIndexPath:indexPath];
        
        // 把cell的属性放到  可变数组中
        [itemArray addObject:attri];
    }
    
    return itemArray;
}

/**
 *  返回CollectionView的ContentSize
 */
- (CGSize)collectionViewContentSize {
    
    CGFloat maxY = 0;
    
    if (self.maxYArray.count) {
        maxY = [self.maxYArray[0] doubleValue];
        
        for (int i = 1; i < _maxColumn; i++) {
            CGFloat arryY = [self.maxYArray[i] doubleValue];
            
            if (maxY < arryY) {
                maxY = arryY;
            }
        }
    }
    
    return CGSizeMake(0, maxY + 10);
}
@end
